#pragma once
#include <functional>
#include <cerrno>
#include <string>
#include <iostream>

// class ThreadTask
// {
//     typedef bool (* func_t)(int);
// public:
//     ThreadTask():_args(-1),_func(nullptr)
//     { }

//     ThreadTask(const int args, func_t func):_func(func), _args(args)
//     { }

//     void setTask(int args, func_t func)
//     {
//         _args = args;
//         _func = func;
//     }
//     bool operator()();
//     {
//         return _func(_args);
//     }
// private:
//     int _args;//参数
//     func_t _func;
// };

class Task
{
private:
    // typedef func_t std::function<int(int, int, char)>;
    using func_t = std::function<int(int, int, char)>;

public:
    Task()
    {
    }
    Task(int x, int y, int op, func_t func)
        : _x(x), _y(y), _op(op), _func(func)
    {
    }

    std::string totaskstring()
    {
        char buf[1024];
        snprintf(buf, 128, "%d %c %d = ？", _x, _op, _y);
        return buf;
    }

    std::string operator()()
    {
        int ret = _func(_x, _y, _op);
        char buf[1024];
        snprintf(buf, sizeof buf, "%d %c %d = %d", _x, _op, _y, ret);
        return buf;
    }

private:
    int _x;
    int _y;
    char _op;
    func_t _func;
};

static char ops[5] = {'+', '-', '*', '/', '%'};

// 自定义的方法
int mymath(int x, int y, char op)
{
    switch (op)
    {
    case '+':
        return x + y;
    case '-':
        return x - y;
    case '*':
        return x * y;
    case '/':
        if (y == 0)
        {
            std::cerr << "error: "
                      << " division error..  "
                      << "return -1" << std::endl;
            return -1;
        }
        return x / y;
    case '%':
        if (y == 0)
        {
            std::cerr << "error: "
                      << " delivery error..  "
                      << "return -1" << std::endl;
            return -1;
        }
        return x % y;
    default:
        std::cerr << "error:"
                  << "input operator error"
                  << "return -1" << std::endl;
        return -1;
    }
}